#version 330 core
// vim: set filetype=cpp :vim

layout(lines) in;
layout(triangle_strip, max_vertices=12) out;

uniform mat4 mProj;
uniform float umpp;

in float rad[];
flat in int nid[];
flat in int mark[];

flat out vec3 cent0;
flat out vec3 cent1;
flat out float rad0;
flat out float rad1;
out vec2 vpos;

flat out int nid0;
flat out int mark0;
flat out int mark1;

void main(void) {
	cent0=gl_in[0].gl_Position.xyz/gl_in[0].gl_Position.w;
	cent1=gl_in[1].gl_Position.xyz/gl_in[1].gl_Position.w;
	rad0=rad[0]+umpp;
	rad1=rad[1]+umpp;

	nid0=nid[0];
	mark0=mark[0];
	mark1=mark[1];

	vec2 u=cent1.xy-cent0.xy;
	float l=length(u);
	float dr=rad1-rad0;
	if(l-abs(dr)<umpp) {
		vec2 cent;
		float r;
		float z;
		if(rad0<rad1) {
			cent=cent1.xy;
			z=cent1.z;
			r=rad1;
		} else {
			cent=cent0.xy;
			z=cent0.z;
			r=rad0;
		}
		vpos=cent+vec2(r, r);
		gl_Position=mProj*vec4(vpos, z, 1.0);
		EmitVertex();
		vpos=cent+vec2(r, -r);
		gl_Position=mProj*vec4(vpos, z, 1.0);
		EmitVertex();
		vpos=cent+vec2(-r, r);
		gl_Position=mProj*vec4(vpos, z, 1.0);
		EmitVertex();
		vpos=cent+vec2(-r, -r);
		gl_Position=mProj*vec4(vpos, z, 1.0);
		EmitVertex();
	} else {
		u=u/l;
		vec2 v=vec2(-u.y, u.x);
		vpos=cent1.xy+u*rad1+v*rad1;
		gl_Position=mProj*vec4(vpos, cent1.z, 1.0);
		EmitVertex();
		vpos=cent1.xy+u*rad1-v*rad1;
		gl_Position=mProj*vec4(vpos, cent1.z, 1.0);
		EmitVertex();
		if(rad0<rad1) {
			vpos=cent1.xy-u*rad1+v*rad1;
			gl_Position=mProj*vec4(vpos, cent1.z, 1.0);
			EmitVertex();
			vpos=cent1.xy-u*rad1-v*rad1;
			gl_Position=mProj*vec4(vpos, cent1.z, 1.0);
			EmitVertex();
		} else {
			vpos=cent0.xy+u*rad0+v*rad0;
			gl_Position=mProj*vec4(vpos, cent0.z, 1.0);
			EmitVertex();
			vpos=cent0.xy+u*rad0-v*rad0;
			gl_Position=mProj*vec4(vpos, cent0.z, 1.0);
			EmitVertex();
		}
			vpos=cent0.xy-u*rad0+v*rad0;
			gl_Position=mProj*vec4(vpos, cent0.z, 1.0);
			EmitVertex();
			vpos=cent0.xy-u*rad0-v*rad0;
			gl_Position=mProj*vec4(vpos, cent0.z, 1.0);
			EmitVertex();
	}
	EndPrimitive();
}

